package limfic.servicios.usuario;

import java.util.List;
import limfic.dominio.Rol;
import limfic.dominio.Usuario;
import limfic.persistencia.AbstractDB;
import limfic.persistencia.mysql.usuario.IUsuarioRepositorio;
import limfic.persistencia.RepositorioException;
import limfic.servicios.ServicioException;
import limfic.ui.IUsuarioInterfazUsuario;

/**
 * Implementacion de las operaciones de la administracion de usuario
 * @author OpenCodes
 * @see IUsuarioServicio
 * @see IUsuarioInterfazUsuario
 */
public class UsuarioServicio implements IUsuarioServicio {

    private AbstractDB fabricaDb;

    @Override
    public void agregar(IUsuarioInterfazUsuario ui) throws ServicioException {

        if (existe(ui.getNombre())) {
            throw new ServicioException("Ya existe un usuario con el mismo nombre");
        }
        Rol rol=null;
        rol=new Rol(ui.getIdRol(), ui.getNombreRol());

        Usuario usuario = new Usuario(ui.getId(), ui.getNombre(), ui.getPassword(),rol);

        IUsuarioRepositorio repo;

        try {
            repo = fabricaDb.getUsuarioRepositorio();
            repo.agregar(usuario);

        } catch (RepositorioException e) {
            throw new ServicioException("Fallo la incorporacion del usuario Nombre:" + usuario.getNombre(), e);
        }
    }

    @Override
    public void eliminar(IUsuarioInterfazUsuario ui) throws ServicioException {
        Rol rol=null;
        rol=new Rol(ui.getIdRol(), ui.getNombreRol());
        Usuario usuario = new Usuario(ui.getId(), ui.getNombre(), ui.getPassword(), rol);

        IUsuarioRepositorio repo;

        try {
            repo = fabricaDb.getUsuarioRepositorio();
            repo.eliminar(usuario);

        } catch (RepositorioException e) {
            throw new ServicioException("Fallo la eliminacion del usuario Nombre:" + usuario.getNombre(), e);
        }
    }

    @Override
    public void init() {
        fabricaDb = AbstractDB.getInstance();
    }

    @Override
    public void listarTodos(IUsuarioInterfazUsuario ui) throws ServicioException {
        IUsuarioRepositorio repo;

        try {
           
            repo = fabricaDb.getUsuarioRepositorio();
            List<Usuario> lista = repo.obtenerTodos();
            ui.setListaUsuarios(lista);
        } catch (RepositorioException e) {
            throw new ServicioException("Fallo el listado de usuarios", e);
        }
    }

    @Override
    public void listarAlgunos(IUsuarioInterfazUsuario ui, String nombre) throws ServicioException {
        IUsuarioRepositorio repo;

        try {

            repo = fabricaDb.getUsuarioRepositorio();

            String[] parametrosBusqueda = {nombre};

            List<Usuario> lista = repo.obtenerAlgunos(parametrosBusqueda);
            ui.setListaUsuarios(lista);
        } catch (RepositorioException e) {
            throw new ServicioException("Fallo el listado de usuarios (Busqueda)", e);
        }
    }

    @Override
    public void modificar(IUsuarioInterfazUsuario ui) throws ServicioException {
        Rol rol=null;
        rol=new Rol(ui.getIdRol(), ui.getNombreRol());
        Usuario usuario = new Usuario(ui.getId(), ui.getNombre(), ui.getPassword(), rol);

        IUsuarioRepositorio repo;

        try {
            repo = fabricaDb.getUsuarioRepositorio();
            repo.modificar(usuario);

        } catch (RepositorioException e) {
            throw new ServicioException("Fallo la modificacion del usuario: " + e.getCause().toString(), e);
            //throw new ServicioException("Fallo la modificacion del usuario Id:" + usuario.getId() + ", Nombre: " + usuario.getNombre(), e);
        }
    }

    @Override
    public boolean existe(String nombre) throws ServicioException {
        IUsuarioRepositorio repo;

        try {

            repo = fabricaDb.getUsuarioRepositorio();

            String[] parametrosBusqueda = {nombre};

            return repo.existe(parametrosBusqueda);

        } catch (RepositorioException e) {

            throw new ServicioException(e.getMessage(), e);
        }
    }

    

}
